//组合继承

// 组合 原型链继承 和 借用构造函数继承
// 背后的思路是：使用原型链实现对原型方法的继承，而通过借用构造函数来实现对实例属性的继承。

/*

优点：融合原型链继承和构造函数的优点，是JavaScript中最常用的继承模式

缺点：调用了两次父类构造函数
（组合继承最大的问题是无论什么情况下，都会调用两次超类型构造函数：一次是在创建子类型原型的时候，另一次是在子类型构造函数内部）

*/

function Parent(name){
    this.name = name;
    this.colors = ['red', 'blue', 'green'];
}

Parent.prototype.getName = function(){
    console.log(this.name);
}

function Child(name,age){
    Parent.call(this,name);// 第二次调用 Parent()
    this.age = age;
}

Child.prototype = new Parent(); // 第一次调用 Parent()

var child1 = new Child('xiaopao',18);
var child2 = new Child('lulu',19);
child1.getName(); // xiaopao
child2.getName(); // lulu
console.log(child1); // Parent { name: 'xiaopao', colors: [ 'red', 'blue', 'green' ], age: 18 }
console.log(child2); // Parent { name: 'lulu', colors: [ 'red', 'blue', 'green' ], age: 19 }
child1.colors.push('yellow');
console.log(child1.colors);  // ["red", "blue", "green", "yellow"]
console.log(child2.colors); // ["red", "blue", "green"]
console.log(child1 instanceof Child); // true
console.log(child1 instanceof Parent); // true

